package org.Yiran.timetale_re.item.rune.type.throwable.base;

import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.Yiran.timetale_re.entity.rune.ThrowableRuneEntity;
import org.Yiran.timetale_re.item.rune.base.AbstractRune;
import org.Yiran.timetale_re.item.rune.base.RuneItem;

/**
 * 投掷类符文基类
 * <p>
 * 该类是所有投掷类符文的抽象基类，定义了投掷类符文的通用行为和属性。
 * 投掷类符文可以被玩家投掷出去，在击中目标或地面时触发效果。
 * 该类继承自AbstractRune，实现了符文的基本接口规范。
 * </p>
 */
public abstract class ThrowableRune extends AbstractRune {

    // ==============================
    // 构造方法
    // ==============================

    /**
     * 构造函数（默认无冷却时间）
     * <p>
     * 创建一个新的投掷类符文实例，默认无冷却时间。
     * 投掷类符文通常不需要冷却时间，因为它们需要被投掷出去才能触发效果。
     * </p>
     *
     * @param type 符文类型字符串标识，用于区分不同类型的投掷符文
     */
    protected ThrowableRune(String type) {
        super(type, RuneItem.THROWABLE, 0); // 投掷类符文无冷却时间
    }

    /**
     * 构造函数（可自定义冷却时间，但强制设置为无冷却时间）
     * <p>
     * 创建一个新的投掷类符文实例，即使指定了冷却时间也会被强制设置为无冷却时间。
     * 这确保了投掷类符文的一致性行为。
     * </p>
     *
     * @param type     符文类型字符串标识，用于区分不同类型的投掷符文
     * @param cooldown 符文使用后的冷却时间（单位：游戏刻，20 tick = 1秒）
     *                 注意：此参数会被忽略，投掷类符文始终无冷却时间
     */
    protected ThrowableRune(String type, int cooldown) {
        super(type, RuneItem.THROWABLE, 0); // 强制设置为无冷却时间
    }

    // ==============================
    // 符文核心方法实现
    // ==============================

    /**
     * 使用符文时的处理逻辑
     * <p>
     * 当玩家使用投掷类符文时调用此方法。该方法会播放投掷音效，
     * 并在服务端创建投掷符文实体，将其从玩家位置投掷出去。
     * </p>
     *
     * @param stack  符文物品堆，包含具体符文信息的物品实例
     * @param level  当前世界对象，提供游戏环境上下文
     * @param player 使用符文的玩家对象
     */
    @Override
    public void onUse(ItemStack stack, Level level, Player player) {
        level.playSound(null, player.blockPosition(), SoundEvents.SNOWBALL_THROW,
                SoundSource.PLAYERS, 0.5F, 0.4F / (level.random.nextFloat() * 0.4F + 0.8F));

        if (!level.isClientSide) {
            // 创建投掷符文实体
            ThrowableRuneEntity runeEntity = new ThrowableRuneEntity(level, player, stack);
            runeEntity.setPos(player.getX(), player.getEyeY() - 0.1F, player.getZ());
            runeEntity.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0F, 1.5F, 1.0F);
            level.addFreshEntity(runeEntity);
        }
    }

    // ==============================
    // 抽象方法定义
    // ==============================

    /**
     * 执行具体的符文效果（由子类实现）
     * <p>
     * 这是一个抽象方法，每个具体的投掷符文子类都需要实现此方法来定义自己的效果。
     * 当投掷的符文实体击中目标或地面时会调用此方法执行具体效果。
     * </p>
     *
     * @param stack  符文物品堆，包含具体符文信息的物品实例
     * @param level  当前世界对象，提供游戏环境上下文
     * @param player 使用符文的玩家对象
     * @param hitPos 击中的位置向量
     */
    public abstract void executeRuneEffect(ItemStack stack, Level level, Player player, net.minecraft.world.phys.Vec3 hitPos);

    // ==============================
    // 持续效果处理
    // ==============================

    /**
     * 投掷类符文默认不处理持续效果
     * <p>
     * 重写父类方法，默认情况下投掷类符文不处理持续性效果。
     * 投掷类符文的效果在击中目标时触发，不需要持续处理。
     * </p>
     *
     * @param stack  符文物品堆，包含具体符文信息的物品实例
     * @param level  当前世界对象，提供游戏环境上下文
     * @param player 持有符文的玩家对象
     */
    @Override
    public void onTick(ItemStack stack, Level level, Player player) {
        // 投掷类符文默认不处理持续效果
    }
}